import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        //输入的材料种类
        int M = sc.nextInt();

        //输入的行李空间大小
        int N = sc.nextInt();

        //定义数组用来接收每种材料所需空间
        int[] weight = new int[M];

        //定义数组用来接收每种材料的价值
        int[] value = new int[M];

        //输入每种材料所需空间
        for (int i = 0; i < M; i++){
            weight[i] = sc.nextInt();
        }

        //输入每种材料的价值
        for (int i = 0; i < M; i++){
            value[i] = sc.nextInt();
        }

        //动态规划

        //1、二维dp数组
        // //dp数组 dp[i][j]表示在编号为[0,i]的物品中任取 放进容量为j的背包中时的最大价值为dp[i][j]
        // int[][] dp = new int[M][N + 1];

        // //递归公式
        // //dp[i][j] 只有从两种状态得到  不放物品i 或 将物品i放进容量为j的背包里
        // //不放：dp[i][j] = dp[i-1][j]
        // //放：dp[i][j] = dp[i-1][j-weight[i]] + value[i] 放i的话要在前i-1个物品中 根据当前容量减去当前i的容量的剩余容量所能装物品的最大价值 即为dp[i-1][j-weight[i]] 再加上当前物品价值 即为结果
        // //dp[i][j]要取放i和不放i的最大值

        // //初始化dp数组
        // //第一列：背包容量为0的时候所有dp[i][0]都应该为0（装不进去物品）
        // //第一行：在从[0,N]的每个容量的背包中 要放物品0 容量够用的情况初始化物品0的价值 容量不够初始化0
        // //除了第一行和第一列的其余位置初始化为任何值都可以 因为这些位置的值都是根据递推公式赋值的 一般初始化为0即可 java定义时会自动初始化为0所以直接不管了

        // //第一列初始化
        // for (int i =0; i < M; i++){
        //     dp[i][0] = 0;
        // }

        // //第一行初始化
        // for (int i = 0; i <= N; i++){
        //     if (i >= weight[0]){
        //         dp[0][i] = value[0];
        //     }
        // }

        // //遍历顺序
        // //二维数组dp[i][j] 先遍历物品再遍历背包 和先遍历背包在遍历物品都可以 不过先遍历物品好理解 下边就先遍历物品再遍历背包 从前向后遍历 （dp数组后面的要依靠前面的值）
        // for (int i = 1; i < M; i++){
        //     for (int j = 1; j <= N; j++){
        //         if (j >= weight[i]){
        //             //当前背包容量大于物品重量 放与不放当前i物品 取其中最大值
        //             dp[i][j] = Math.max(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);
        //         } else {
        //             //当前背包容量小于物品重量 放不进去i
        //             dp[i][j] = dp[i - 1][j];
        //         }
        //     }
        // }

        // //打印容量为N时的最大价值
        // System.out.println(dp[M - 1][N]);

        //2、使用一维dp数组
        //相当于把上一层旧的值 替换成新一层时 新的值 像滚动一样 dp[j]表示容量为j的背包背的最大价值为   dp[j]
        int[] dp = new int[N + 1];

        //递归公式
        //不放与放物品i的最大值 dp[j] = max(dp[j], dp[j-weight[i]] + value[i])

        //初始化数组 不能是一个大的正数 这样会破坏掉递归公式中取最大值 所以就初始化都为0就好

        //遍历顺序 必须先正向遍历物品 然后 倒序遍历背包（防止前面的物品重复放到背包里）
        for (int i = 0; i < M; i++){
            for (int j = N; j >= weight[i]; j--){

                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);

            }
        }

        System.out.println(dp[N]);
    }

}